home *** CD-ROM | disk | FTP | other *** search
/ Personal Computer World 2008 February / PCWFEB08.iso / Software / Freeware / Miro 1.0 / Miro_Installer.exe / Miro_Downloader.exe / xml / dom / minidom.pyc (.txt) < prev    next >
Encoding:
Python Compiled Bytecode  |  2007-11-12  |  60.3 KB  |  2,122 lines

  1. # Source Generated with Decompyle++
  2. # File: in.pyc (Python 2.5)
  3.  
  4. '''minidom.py -- a lightweight DOM implementation.
  5.  
  6. parse("foo.xml")
  7.  
  8. parseString("<foo><bar/></foo>")
  9.  
  10. Todo:
  11. =====
  12.  * convenience methods for getting elements and text.
  13.  * more testing
  14.  * bring some of the writer and linearizer code into conformance with this
  15.         interface
  16.  * SAX 2 namespaces
  17. '''
  18. import xml.dom as xml
  19. from xml.dom import EMPTY_NAMESPACE, EMPTY_PREFIX, XMLNS_NAMESPACE, domreg
  20. from xml.dom.minicompat import *
  21. from xml.dom.xmlbuilder import DOMImplementationLS, DocumentLS
  22. _nodeTypes_with_children = (xml.dom.Node.ELEMENT_NODE, xml.dom.Node.ENTITY_REFERENCE_NODE)
  23.  
  24. class Node(xml.dom.Node):
  25.     namespaceURI = None
  26.     parentNode = None
  27.     ownerDocument = None
  28.     nextSibling = None
  29.     previousSibling = None
  30.     prefix = EMPTY_PREFIX
  31.     
  32.     def __nonzero__(self):
  33.         return True
  34.  
  35.     
  36.     def toxml(self, encoding = None):
  37.         return self.toprettyxml('', '', encoding)
  38.  
  39.     
  40.     def toprettyxml(self, indent = '\t', newl = '\n', encoding = None):
  41.         writer = _get_StringIO()
  42.         if encoding is not None:
  43.             import codecs
  44.             writer = codecs.lookup(encoding)[3](writer)
  45.         
  46.         if self.nodeType == Node.DOCUMENT_NODE:
  47.             self.writexml(writer, '', indent, newl, encoding)
  48.         else:
  49.             self.writexml(writer, '', indent, newl)
  50.         return writer.getvalue()
  51.  
  52.     
  53.     def hasChildNodes(self):
  54.         if self.childNodes:
  55.             return True
  56.         else:
  57.             return False
  58.  
  59.     
  60.     def _get_childNodes(self):
  61.         return self.childNodes
  62.  
  63.     
  64.     def _get_firstChild(self):
  65.         if self.childNodes:
  66.             return self.childNodes[0]
  67.         
  68.  
  69.     
  70.     def _get_lastChild(self):
  71.         if self.childNodes:
  72.             return self.childNodes[-1]
  73.         
  74.  
  75.     
  76.     def insertBefore(self, newChild, refChild):
  77.         if newChild.nodeType == self.DOCUMENT_FRAGMENT_NODE:
  78.             for c in tuple(newChild.childNodes):
  79.                 self.insertBefore(c, refChild)
  80.             
  81.             return newChild
  82.         
  83.         if newChild.nodeType not in self._child_node_types:
  84.             raise xml.dom.HierarchyRequestErr('%s cannot be child of %s' % (repr(newChild), repr(self)))
  85.         
  86.         if newChild.parentNode is not None:
  87.             newChild.parentNode.removeChild(newChild)
  88.         
  89.         if refChild is None:
  90.             self.appendChild(newChild)
  91.         else:
  92.             
  93.             try:
  94.                 index = self.childNodes.index(refChild)
  95.             except ValueError:
  96.                 raise xml.dom.NotFoundErr()
  97.  
  98.             if newChild.nodeType in _nodeTypes_with_children:
  99.                 _clear_id_cache(self)
  100.             
  101.             self.childNodes.insert(index, newChild)
  102.             newChild.nextSibling = refChild
  103.             refChild.previousSibling = newChild
  104.             if index:
  105.                 node = self.childNodes[index - 1]
  106.                 node.nextSibling = newChild
  107.                 newChild.previousSibling = node
  108.             else:
  109.                 newChild.previousSibling = None
  110.             newChild.parentNode = self
  111.         return newChild
  112.  
  113.     
  114.     def appendChild(self, node):
  115.         if node.nodeType == self.DOCUMENT_FRAGMENT_NODE:
  116.             for c in tuple(node.childNodes):
  117.                 self.appendChild(c)
  118.             
  119.             return node
  120.         
  121.         if node.nodeType not in self._child_node_types:
  122.             raise xml.dom.HierarchyRequestErr('%s cannot be child of %s' % (repr(node), repr(self)))
  123.         elif node.nodeType in _nodeTypes_with_children:
  124.             _clear_id_cache(self)
  125.         
  126.         if node.parentNode is not None:
  127.             node.parentNode.removeChild(node)
  128.         
  129.         _append_child(self, node)
  130.         node.nextSibling = None
  131.         return node
  132.  
  133.     
  134.     def replaceChild(self, newChild, oldChild):
  135.         if newChild.nodeType == self.DOCUMENT_FRAGMENT_NODE:
  136.             refChild = oldChild.nextSibling
  137.             self.removeChild(oldChild)
  138.             return self.insertBefore(newChild, refChild)
  139.         
  140.         if newChild.nodeType not in self._child_node_types:
  141.             raise xml.dom.HierarchyRequestErr('%s cannot be child of %s' % (repr(newChild), repr(self)))
  142.         
  143.         if newChild is oldChild:
  144.             return None
  145.         
  146.         if newChild.parentNode is not None:
  147.             newChild.parentNode.removeChild(newChild)
  148.         
  149.         
  150.         try:
  151.             index = self.childNodes.index(oldChild)
  152.         except ValueError:
  153.             raise xml.dom.NotFoundErr()
  154.  
  155.         self.childNodes[index] = newChild
  156.         newChild.parentNode = self
  157.         oldChild.parentNode = None
  158.         if newChild.nodeType in _nodeTypes_with_children or oldChild.nodeType in _nodeTypes_with_children:
  159.             _clear_id_cache(self)
  160.         
  161.         newChild.nextSibling = oldChild.nextSibling
  162.         newChild.previousSibling = oldChild.previousSibling
  163.         oldChild.nextSibling = None
  164.         oldChild.previousSibling = None
  165.         if newChild.previousSibling:
  166.             newChild.previousSibling.nextSibling = newChild
  167.         
  168.         if newChild.nextSibling:
  169.             newChild.nextSibling.previousSibling = newChild
  170.         
  171.         return oldChild
  172.  
  173.     
  174.     def removeChild(self, oldChild):
  175.         
  176.         try:
  177.             self.childNodes.remove(oldChild)
  178.         except ValueError:
  179.             raise xml.dom.NotFoundErr()
  180.  
  181.         if oldChild.nextSibling is not None:
  182.             oldChild.nextSibling.previousSibling = oldChild.previousSibling
  183.         
  184.         if oldChild.previousSibling is not None:
  185.             oldChild.previousSibling.nextSibling = oldChild.nextSibling
  186.         
  187.         oldChild.nextSibling = None
  188.         oldChild.previousSibling = None
  189.         if oldChild.nodeType in _nodeTypes_with_children:
  190.             _clear_id_cache(self)
  191.         
  192.         oldChild.parentNode = None
  193.         return oldChild
  194.  
  195.     
  196.     def normalize(self):
  197.         L = []
  198.         for child in self.childNodes:
  199.             if child.nodeType == Node.TEXT_NODE:
  200.                 data = child.data
  201.                 if data and L and L[-1].nodeType == child.nodeType:
  202.                     node = L[-1]
  203.                     node.data = node.data + child.data
  204.                     node.nextSibling = child.nextSibling
  205.                     child.unlink()
  206.                 elif data:
  207.                     if L:
  208.                         L[-1].nextSibling = child
  209.                         child.previousSibling = L[-1]
  210.                     else:
  211.                         child.previousSibling = None
  212.                     L.append(child)
  213.                 else:
  214.                     child.unlink()
  215.             L[-1].nodeType == child.nodeType
  216.             if L:
  217.                 L[-1].nextSibling = child
  218.                 child.previousSibling = L[-1]
  219.             else:
  220.                 child.previousSibling = None
  221.             L.append(child)
  222.             if child.nodeType == Node.ELEMENT_NODE:
  223.                 child.normalize()
  224.                 continue
  225.         
  226.         self.childNodes[:] = L
  227.  
  228.     
  229.     def cloneNode(self, deep):
  230.         if not self.ownerDocument:
  231.             pass
  232.         return _clone_node(self, deep, self)
  233.  
  234.     
  235.     def isSupported(self, feature, version):
  236.         return self.ownerDocument.implementation.hasFeature(feature, version)
  237.  
  238.     
  239.     def _get_localName(self):
  240.         pass
  241.  
  242.     
  243.     def isSameNode(self, other):
  244.         return self is other
  245.  
  246.     
  247.     def getInterface(self, feature):
  248.         if self.isSupported(feature, None):
  249.             return self
  250.         else:
  251.             return None
  252.  
  253.     
  254.     def getUserData(self, key):
  255.         
  256.         try:
  257.             return self._user_data[key][0]
  258.         except (AttributeError, KeyError):
  259.             return None
  260.  
  261.  
  262.     
  263.     def setUserData(self, key, data, handler):
  264.         old = None
  265.         
  266.         try:
  267.             d = self._user_data
  268.         except AttributeError:
  269.             d = { }
  270.             self._user_data = d
  271.  
  272.         if d.has_key(key):
  273.             old = d[key][0]
  274.         
  275.         if data is None:
  276.             handler = None
  277.             if old is not None:
  278.                 del d[key]
  279.             
  280.         else:
  281.             d[key] = (data, handler)
  282.         return old
  283.  
  284.     
  285.     def _call_user_data_handler(self, operation, src, dst):
  286.         if hasattr(self, '_user_data'):
  287.             for data, handler in self._user_data.items():
  288.                 if handler is not None:
  289.                     handler.handle(operation, key, data, src, dst)
  290.                     continue
  291.             
  292.         
  293.  
  294.     
  295.     def unlink(self):
  296.         self.parentNode = None
  297.         self.ownerDocument = None
  298.         if self.childNodes:
  299.             for child in self.childNodes:
  300.                 child.unlink()
  301.             
  302.             self.childNodes = NodeList()
  303.         
  304.         self.previousSibling = None
  305.         self.nextSibling = None
  306.  
  307.  
  308. defproperty(Node, 'firstChild', doc = 'First child node, or None.')
  309. defproperty(Node, 'lastChild', doc = 'Last child node, or None.')
  310. defproperty(Node, 'localName', doc = 'Namespace-local name of this node.')
  311.  
  312. def _append_child(self, node):
  313.     childNodes = self.childNodes
  314.     if childNodes:
  315.         last = childNodes[-1]
  316.         node.__dict__['previousSibling'] = last
  317.         last.__dict__['nextSibling'] = node
  318.     
  319.     childNodes.append(node)
  320.     node.__dict__['parentNode'] = self
  321.  
  322.  
  323. def _in_document(node):
  324.     while node is not None:
  325.         if node.nodeType == Node.DOCUMENT_NODE:
  326.             return True
  327.         
  328.         node = node.parentNode
  329.     return False
  330.  
  331.  
  332. def _write_data(writer, data):
  333.     '''Writes datachars to writer.'''
  334.     data = data.replace('&', '&').replace('<', '<')
  335.     data = data.replace('"', '"').replace('>', '>')
  336.     writer.write(data)
  337.  
  338.  
  339. def _get_elements_by_tagName_helper(parent, name, rc):
  340.     for node in parent.childNodes:
  341.         if node.nodeType == Node.ELEMENT_NODE:
  342.             if name == '*' or node.tagName == name:
  343.                 rc.append(node)
  344.             
  345.         _get_elements_by_tagName_helper(node, name, rc)
  346.     
  347.     return rc
  348.  
  349.  
  350. def _get_elements_by_tagName_ns_helper(parent, nsURI, localName, rc):
  351.     for node in parent.childNodes:
  352.         if node.nodeType == Node.ELEMENT_NODE:
  353.             if localName == '*' or node.localName == localName:
  354.                 if nsURI == '*' or node.namespaceURI == nsURI:
  355.                     rc.append(node)
  356.                 
  357.             _get_elements_by_tagName_ns_helper(node, nsURI, localName, rc)
  358.             continue
  359.     
  360.     return rc
  361.  
  362.  
  363. class DocumentFragment(Node):
  364.     nodeType = Node.DOCUMENT_FRAGMENT_NODE
  365.     nodeName = '#document-fragment'
  366.     nodeValue = None
  367.     attributes = None
  368.     parentNode = None
  369.     _child_node_types = (Node.ELEMENT_NODE, Node.TEXT_NODE, Node.CDATA_SECTION_NODE, Node.ENTITY_REFERENCE_NODE, Node.PROCESSING_INSTRUCTION_NODE, Node.COMMENT_NODE, Node.NOTATION_NODE)
  370.     
  371.     def __init__(self):
  372.         self.childNodes = NodeList()
  373.  
  374.  
  375.  
  376. class Attr(Node):
  377.     nodeType = Node.ATTRIBUTE_NODE
  378.     attributes = None
  379.     ownerElement = None
  380.     specified = False
  381.     _is_id = False
  382.     _child_node_types = (Node.TEXT_NODE, Node.ENTITY_REFERENCE_NODE)
  383.     
  384.     def __init__(self, qName, namespaceURI = EMPTY_NAMESPACE, localName = None, prefix = None):
  385.         d = self.__dict__
  386.         d['nodeName'] = d['name'] = qName
  387.         d['namespaceURI'] = namespaceURI
  388.         d['prefix'] = prefix
  389.         d['childNodes'] = NodeList()
  390.         self.childNodes.append(Text())
  391.  
  392.     
  393.     def _get_localName(self):
  394.         return self.nodeName.split(':', 1)[-1]
  395.  
  396.     
  397.     def _get_name(self):
  398.         return self.name
  399.  
  400.     
  401.     def _get_specified(self):
  402.         return self.specified
  403.  
  404.     
  405.     def __setattr__(self, name, value):
  406.         d = self.__dict__
  407.         if name in ('value', 'nodeValue'):
  408.             d['value'] = d['nodeValue'] = value
  409.             d2 = self.childNodes[0].__dict__
  410.             d2['data'] = d2['nodeValue'] = value
  411.             if self.ownerElement is not None:
  412.                 _clear_id_cache(self.ownerElement)
  413.             
  414.         elif name in ('name', 'nodeName'):
  415.             d['name'] = d['nodeName'] = value
  416.             if self.ownerElement is not None:
  417.                 _clear_id_cache(self.ownerElement)
  418.             
  419.         else:
  420.             d[name] = value
  421.  
  422.     
  423.     def _set_prefix(self, prefix):
  424.         nsuri = self.namespaceURI
  425.         if prefix == 'xmlns':
  426.             if nsuri and nsuri != XMLNS_NAMESPACE:
  427.                 raise xml.dom.NamespaceErr("illegal use of 'xmlns' prefix for the wrong namespace")
  428.             
  429.         
  430.         d = self.__dict__
  431.         d['prefix'] = prefix
  432.         if prefix is None:
  433.             newName = self.localName
  434.         else:
  435.             newName = '%s:%s' % (prefix, self.localName)
  436.         if self.ownerElement:
  437.             _clear_id_cache(self.ownerElement)
  438.         
  439.         d['nodeName'] = d['name'] = newName
  440.  
  441.     
  442.     def _set_value(self, value):
  443.         d = self.__dict__
  444.         d['value'] = d['nodeValue'] = value
  445.         if self.ownerElement:
  446.             _clear_id_cache(self.ownerElement)
  447.         
  448.         self.childNodes[0].data = value
  449.  
  450.     
  451.     def unlink(self):
  452.         elem = self.ownerElement
  453.         if elem is not None:
  454.             del elem._attrs[self.nodeName]
  455.             del elem._attrsNS[(self.namespaceURI, self.localName)]
  456.             if self._is_id:
  457.                 self._is_id = False
  458.                 elem._magic_id_nodes -= 1
  459.                 self.ownerDocument._magic_id_count -= 1
  460.             
  461.         
  462.         for child in self.childNodes:
  463.             child.unlink()
  464.         
  465.         del self.childNodes[:]
  466.  
  467.     
  468.     def _get_isId(self):
  469.         if self._is_id:
  470.             return True
  471.         
  472.         doc = self.ownerDocument
  473.         elem = self.ownerElement
  474.         if doc is None or elem is None:
  475.             return False
  476.         
  477.         info = doc._get_elem_info(elem)
  478.         if info is None:
  479.             return False
  480.         
  481.         if self.namespaceURI:
  482.             return info.isIdNS(self.namespaceURI, self.localName)
  483.         else:
  484.             return info.isId(self.nodeName)
  485.  
  486.     
  487.     def _get_schemaType(self):
  488.         doc = self.ownerDocument
  489.         elem = self.ownerElement
  490.         if doc is None or elem is None:
  491.             return _no_type
  492.         
  493.         info = doc._get_elem_info(elem)
  494.         if info is None:
  495.             return _no_type
  496.         
  497.         if self.namespaceURI:
  498.             return info.getAttributeTypeNS(self.namespaceURI, self.localName)
  499.         else:
  500.             return info.getAttributeType(self.nodeName)
  501.  
  502.  
  503. defproperty(Attr, 'isId', doc = 'True if this attribute is an ID.')
  504. defproperty(Attr, 'localName', doc = 'Namespace-local name of this attribute.')
  505. defproperty(Attr, 'schemaType', doc = 'Schema type for this attribute.')
  506.  
  507. class NamedNodeMap(object):
  508.     """The attribute list is a transient interface to the underlying
  509.     dictionaries.  Mutations here will change the underlying element's
  510.     dictionary.
  511.  
  512.     Ordering is imposed artificially and does not reflect the order of
  513.     attributes as found in an input document.
  514.     """
  515.     __slots__ = ('_attrs', '_attrsNS', '_ownerElement')
  516.     
  517.     def __init__(self, attrs, attrsNS, ownerElement):
  518.         self._attrs = attrs
  519.         self._attrsNS = attrsNS
  520.         self._ownerElement = ownerElement
  521.  
  522.     
  523.     def _get_length(self):
  524.         return len(self._attrs)
  525.  
  526.     
  527.     def item(self, index):
  528.         
  529.         try:
  530.             return self[self._attrs.keys()[index]]
  531.         except IndexError:
  532.             return None
  533.  
  534.  
  535.     
  536.     def items(self):
  537.         L = []
  538.         for node in self._attrs.values():
  539.             L.append((node.nodeName, node.value))
  540.         
  541.         return L
  542.  
  543.     
  544.     def itemsNS(self):
  545.         L = []
  546.         for node in self._attrs.values():
  547.             L.append(((node.namespaceURI, node.localName), node.value))
  548.         
  549.         return L
  550.  
  551.     
  552.     def has_key(self, key):
  553.         if isinstance(key, StringTypes):
  554.             return self._attrs.has_key(key)
  555.         else:
  556.             return self._attrsNS.has_key(key)
  557.  
  558.     
  559.     def keys(self):
  560.         return self._attrs.keys()
  561.  
  562.     
  563.     def keysNS(self):
  564.         return self._attrsNS.keys()
  565.  
  566.     
  567.     def values(self):
  568.         return self._attrs.values()
  569.  
  570.     
  571.     def get(self, name, value = None):
  572.         return self._attrs.get(name, value)
  573.  
  574.     __len__ = _get_length
  575.     
  576.     def __cmp__(self, other):
  577.         if self._attrs is getattr(other, '_attrs', None):
  578.             return 0
  579.         else:
  580.             return cmp(id(self), id(other))
  581.  
  582.     
  583.     def __getitem__(self, attname_or_tuple):
  584.         if isinstance(attname_or_tuple, tuple):
  585.             return self._attrsNS[attname_or_tuple]
  586.         else:
  587.             return self._attrs[attname_or_tuple]
  588.  
  589.     
  590.     def __setitem__(self, attname, value):
  591.         if isinstance(value, StringTypes):
  592.             
  593.             try:
  594.                 node = self._attrs[attname]
  595.             except KeyError:
  596.                 node = Attr(attname)
  597.                 node.ownerDocument = self._ownerElement.ownerDocument
  598.                 self.setNamedItem(node)
  599.  
  600.             node.value = value
  601.         elif not isinstance(value, Attr):
  602.             raise TypeError, 'value must be a string or Attr object'
  603.         
  604.         node = value
  605.         self.setNamedItem(node)
  606.  
  607.     
  608.     def getNamedItem(self, name):
  609.         
  610.         try:
  611.             return self._attrs[name]
  612.         except KeyError:
  613.             return None
  614.  
  615.  
  616.     
  617.     def getNamedItemNS(self, namespaceURI, localName):
  618.         
  619.         try:
  620.             return self._attrsNS[(namespaceURI, localName)]
  621.         except KeyError:
  622.             return None
  623.  
  624.  
  625.     
  626.     def removeNamedItem(self, name):
  627.         n = self.getNamedItem(name)
  628.         if n is not None:
  629.             _clear_id_cache(self._ownerElement)
  630.             del self._attrs[n.nodeName]
  631.             del self._attrsNS[(n.namespaceURI, n.localName)]
  632.             if n.__dict__.has_key('ownerElement'):
  633.                 n.__dict__['ownerElement'] = None
  634.             
  635.             return n
  636.         else:
  637.             raise xml.dom.NotFoundErr()
  638.  
  639.     
  640.     def removeNamedItemNS(self, namespaceURI, localName):
  641.         n = self.getNamedItemNS(namespaceURI, localName)
  642.         if n is not None:
  643.             _clear_id_cache(self._ownerElement)
  644.             del self._attrsNS[(n.namespaceURI, n.localName)]
  645.             del self._attrs[n.nodeName]
  646.             if n.__dict__.has_key('ownerElement'):
  647.                 n.__dict__['ownerElement'] = None
  648.             
  649.             return n
  650.         else:
  651.             raise xml.dom.NotFoundErr()
  652.  
  653.     
  654.     def setNamedItem(self, node):
  655.         if not isinstance(node, Attr):
  656.             raise xml.dom.HierarchyRequestErr('%s cannot be child of %s' % (repr(node), repr(self)))
  657.         
  658.         old = self._attrs.get(node.name)
  659.         if old:
  660.             old.unlink()
  661.         
  662.         self._attrs[node.name] = node
  663.         self._attrsNS[(node.namespaceURI, node.localName)] = node
  664.         node.ownerElement = self._ownerElement
  665.         _clear_id_cache(node.ownerElement)
  666.         return old
  667.  
  668.     
  669.     def setNamedItemNS(self, node):
  670.         return self.setNamedItem(node)
  671.  
  672.     
  673.     def __delitem__(self, attname_or_tuple):
  674.         node = self[attname_or_tuple]
  675.         _clear_id_cache(node.ownerElement)
  676.         node.unlink()
  677.  
  678.     
  679.     def __getstate__(self):
  680.         return (self._attrs, self._attrsNS, self._ownerElement)
  681.  
  682.     
  683.     def __setstate__(self, state):
  684.         (self._attrs, self._attrsNS, self._ownerElement) = state
  685.  
  686.  
  687. defproperty(NamedNodeMap, 'length', doc = 'Number of nodes in the NamedNodeMap.')
  688. AttributeList = NamedNodeMap
  689.  
  690. class TypeInfo(object):
  691.     __slots__ = ('namespace', 'name')
  692.     
  693.     def __init__(self, namespace, name):
  694.         self.namespace = namespace
  695.         self.name = name
  696.  
  697.     
  698.     def __repr__(self):
  699.         if self.namespace:
  700.             return '<TypeInfo %r (from %r)>' % (self.name, self.namespace)
  701.         else:
  702.             return '<TypeInfo %r>' % self.name
  703.  
  704.     
  705.     def _get_name(self):
  706.         return self.name
  707.  
  708.     
  709.     def _get_namespace(self):
  710.         return self.namespace
  711.  
  712.  
  713. _no_type = TypeInfo(None, None)
  714.  
  715. class Element(Node):
  716.     nodeType = Node.ELEMENT_NODE
  717.     nodeValue = None
  718.     schemaType = _no_type
  719.     _magic_id_nodes = 0
  720.     _child_node_types = (Node.ELEMENT_NODE, Node.PROCESSING_INSTRUCTION_NODE, Node.COMMENT_NODE, Node.TEXT_NODE, Node.CDATA_SECTION_NODE, Node.ENTITY_REFERENCE_NODE)
  721.     
  722.     def __init__(self, tagName, namespaceURI = EMPTY_NAMESPACE, prefix = None, localName = None):
  723.         self.tagName = self.nodeName = tagName
  724.         self.prefix = prefix
  725.         self.namespaceURI = namespaceURI
  726.         self.childNodes = NodeList()
  727.         self._attrs = { }
  728.         self._attrsNS = { }
  729.  
  730.     
  731.     def _get_localName(self):
  732.         return self.tagName.split(':', 1)[-1]
  733.  
  734.     
  735.     def _get_tagName(self):
  736.         return self.tagName
  737.  
  738.     
  739.     def unlink(self):
  740.         for attr in self._attrs.values():
  741.             attr.unlink()
  742.         
  743.         self._attrs = None
  744.         self._attrsNS = None
  745.         Node.unlink(self)
  746.  
  747.     
  748.     def getAttribute(self, attname):
  749.         
  750.         try:
  751.             return self._attrs[attname].value
  752.         except KeyError:
  753.             return ''
  754.  
  755.  
  756.     
  757.     def getAttributeNS(self, namespaceURI, localName):
  758.         
  759.         try:
  760.             return self._attrsNS[(namespaceURI, localName)].value
  761.         except KeyError:
  762.             return ''
  763.  
  764.  
  765.     
  766.     def setAttribute(self, attname, value):
  767.         attr = self.getAttributeNode(attname)
  768.         if attr is None:
  769.             attr = Attr(attname)
  770.             d = attr.__dict__
  771.             d['value'] = d['nodeValue'] = value
  772.             d['ownerDocument'] = self.ownerDocument
  773.             self.setAttributeNode(attr)
  774.         elif value != attr.value:
  775.             d = attr.__dict__
  776.             d['value'] = d['nodeValue'] = value
  777.             if attr.isId:
  778.                 _clear_id_cache(self)
  779.             
  780.         
  781.  
  782.     
  783.     def setAttributeNS(self, namespaceURI, qualifiedName, value):
  784.         (prefix, localname) = _nssplit(qualifiedName)
  785.         attr = self.getAttributeNodeNS(namespaceURI, localname)
  786.         if attr is None:
  787.             attr = Attr(qualifiedName, namespaceURI, localname, prefix)
  788.             d = attr.__dict__
  789.             d['prefix'] = prefix
  790.             d['nodeName'] = qualifiedName
  791.             d['value'] = d['nodeValue'] = value
  792.             d['ownerDocument'] = self.ownerDocument
  793.             self.setAttributeNode(attr)
  794.         else:
  795.             d = attr.__dict__
  796.             if value != attr.value:
  797.                 d['value'] = d['nodeValue'] = value
  798.                 if attr.isId:
  799.                     _clear_id_cache(self)
  800.                 
  801.             
  802.             if attr.prefix != prefix:
  803.                 d['prefix'] = prefix
  804.                 d['nodeName'] = qualifiedName
  805.             
  806.  
  807.     
  808.     def getAttributeNode(self, attrname):
  809.         return self._attrs.get(attrname)
  810.  
  811.     
  812.     def getAttributeNodeNS(self, namespaceURI, localName):
  813.         return self._attrsNS.get((namespaceURI, localName))
  814.  
  815.     
  816.     def setAttributeNode(self, attr):
  817.         if attr.ownerElement not in (None, self):
  818.             raise xml.dom.InuseAttributeErr('attribute node already owned')
  819.         
  820.         old1 = self._attrs.get(attr.name, None)
  821.         if old1 is not None:
  822.             self.removeAttributeNode(old1)
  823.         
  824.         old2 = self._attrsNS.get((attr.namespaceURI, attr.localName), None)
  825.         if old2 is not None and old2 is not old1:
  826.             self.removeAttributeNode(old2)
  827.         
  828.         _set_attribute_node(self, attr)
  829.         if old1 is not attr:
  830.             return old1
  831.         
  832.         if old2 is not attr:
  833.             return old2
  834.         
  835.  
  836.     setAttributeNodeNS = setAttributeNode
  837.     
  838.     def removeAttribute(self, name):
  839.         
  840.         try:
  841.             attr = self._attrs[name]
  842.         except KeyError:
  843.             raise xml.dom.NotFoundErr()
  844.  
  845.         self.removeAttributeNode(attr)
  846.  
  847.     
  848.     def removeAttributeNS(self, namespaceURI, localName):
  849.         
  850.         try:
  851.             attr = self._attrsNS[(namespaceURI, localName)]
  852.         except KeyError:
  853.             raise xml.dom.NotFoundErr()
  854.  
  855.         self.removeAttributeNode(attr)
  856.  
  857.     
  858.     def removeAttributeNode(self, node):
  859.         if node is None:
  860.             raise xml.dom.NotFoundErr()
  861.         
  862.         
  863.         try:
  864.             self._attrs[node.name]
  865.         except KeyError:
  866.             raise xml.dom.NotFoundErr()
  867.  
  868.         _clear_id_cache(self)
  869.         node.unlink()
  870.         node.ownerDocument = self.ownerDocument
  871.  
  872.     removeAttributeNodeNS = removeAttributeNode
  873.     
  874.     def hasAttribute(self, name):
  875.         return self._attrs.has_key(name)
  876.  
  877.     
  878.     def hasAttributeNS(self, namespaceURI, localName):
  879.         return self._attrsNS.has_key((namespaceURI, localName))
  880.  
  881.     
  882.     def getElementsByTagName(self, name):
  883.         return _get_elements_by_tagName_helper(self, name, NodeList())
  884.  
  885.     
  886.     def getElementsByTagNameNS(self, namespaceURI, localName):
  887.         return _get_elements_by_tagName_ns_helper(self, namespaceURI, localName, NodeList())
  888.  
  889.     
  890.     def __repr__(self):
  891.         return '<DOM Element: %s at %#x>' % (self.tagName, id(self))
  892.  
  893.     
  894.     def writexml(self, writer, indent = '', addindent = '', newl = ''):
  895.         writer.write(indent + '<' + self.tagName)
  896.         attrs = self._get_attributes()
  897.         a_names = attrs.keys()
  898.         a_names.sort()
  899.         for a_name in a_names:
  900.             writer.write(' %s="' % a_name)
  901.             _write_data(writer, attrs[a_name].value)
  902.             writer.write('"')
  903.         
  904.         if self.childNodes:
  905.             writer.write('>%s' % newl)
  906.             for node in self.childNodes:
  907.                 node.writexml(writer, indent + addindent, addindent, newl)
  908.             
  909.             writer.write('%s</%s>%s' % (indent, self.tagName, newl))
  910.         else:
  911.             writer.write('/>%s' % newl)
  912.  
  913.     
  914.     def _get_attributes(self):
  915.         return NamedNodeMap(self._attrs, self._attrsNS, self)
  916.  
  917.     
  918.     def hasAttributes(self):
  919.         if self._attrs:
  920.             return True
  921.         else:
  922.             return False
  923.  
  924.     
  925.     def setIdAttribute(self, name):
  926.         idAttr = self.getAttributeNode(name)
  927.         self.setIdAttributeNode(idAttr)
  928.  
  929.     
  930.     def setIdAttributeNS(self, namespaceURI, localName):
  931.         idAttr = self.getAttributeNodeNS(namespaceURI, localName)
  932.         self.setIdAttributeNode(idAttr)
  933.  
  934.     
  935.     def setIdAttributeNode(self, idAttr):
  936.         if idAttr is None or not self.isSameNode(idAttr.ownerElement):
  937.             raise xml.dom.NotFoundErr()
  938.         
  939.         if _get_containing_entref(self) is not None:
  940.             raise xml.dom.NoModificationAllowedErr()
  941.         
  942.  
  943.  
  944. defproperty(Element, 'attributes', doc = 'NamedNodeMap of attributes on the element.')
  945. defproperty(Element, 'localName', doc = 'Namespace-local name of this element.')
  946.  
  947. def _set_attribute_node(element, attr):
  948.     _clear_id_cache(element)
  949.     element._attrs[attr.name] = attr
  950.     element._attrsNS[(attr.namespaceURI, attr.localName)] = attr
  951.     attr.__dict__['ownerElement'] = element
  952.  
  953.  
  954. class Childless:
  955.     '''Mixin that makes childless-ness easy to implement and avoids
  956.     the complexity of the Node methods that deal with children.
  957.     '''
  958.     attributes = None
  959.     childNodes = EmptyNodeList()
  960.     firstChild = None
  961.     lastChild = None
  962.     
  963.     def _get_firstChild(self):
  964.         pass
  965.  
  966.     
  967.     def _get_lastChild(self):
  968.         pass
  969.  
  970.     
  971.     def appendChild(self, node):
  972.         raise xml.dom.HierarchyRequestErr(self.nodeName + ' nodes cannot have children')
  973.  
  974.     
  975.     def hasChildNodes(self):
  976.         return False
  977.  
  978.     
  979.     def insertBefore(self, newChild, refChild):
  980.         raise xml.dom.HierarchyRequestErr(self.nodeName + ' nodes do not have children')
  981.  
  982.     
  983.     def removeChild(self, oldChild):
  984.         raise xml.dom.NotFoundErr(self.nodeName + ' nodes do not have children')
  985.  
  986.     
  987.     def replaceChild(self, newChild, oldChild):
  988.         raise xml.dom.HierarchyRequestErr(self.nodeName + ' nodes do not have children')
  989.  
  990.  
  991.  
  992. class ProcessingInstruction(Childless, Node):
  993.     nodeType = Node.PROCESSING_INSTRUCTION_NODE
  994.     
  995.     def __init__(self, target, data):
  996.         self.target = self.nodeName = target
  997.         self.data = self.nodeValue = data
  998.  
  999.     
  1000.     def _get_data(self):
  1001.         return self.data
  1002.  
  1003.     
  1004.     def _set_data(self, value):
  1005.         d = self.__dict__
  1006.         d['data'] = d['nodeValue'] = value
  1007.  
  1008.     
  1009.     def _get_target(self):
  1010.         return self.target
  1011.  
  1012.     
  1013.     def _set_target(self, value):
  1014.         d = self.__dict__
  1015.         d['target'] = d['nodeName'] = value
  1016.  
  1017.     
  1018.     def __setattr__(self, name, value):
  1019.         if name == 'data' or name == 'nodeValue':
  1020.             self.__dict__['data'] = self.__dict__['nodeValue'] = value
  1021.         elif name == 'target' or name == 'nodeName':
  1022.             self.__dict__['target'] = self.__dict__['nodeName'] = value
  1023.         else:
  1024.             self.__dict__[name] = value
  1025.  
  1026.     
  1027.     def writexml(self, writer, indent = '', addindent = '', newl = ''):
  1028.         writer.write('%s<?%s %s?>%s' % (indent, self.target, self.data, newl))
  1029.  
  1030.  
  1031.  
  1032. class CharacterData(Childless, Node):
  1033.     
  1034.     def _get_length(self):
  1035.         return len(self.data)
  1036.  
  1037.     __len__ = _get_length
  1038.     
  1039.     def _get_data(self):
  1040.         return self.__dict__['data']
  1041.  
  1042.     
  1043.     def _set_data(self, data):
  1044.         d = self.__dict__
  1045.         d['data'] = d['nodeValue'] = data
  1046.  
  1047.     _get_nodeValue = _get_data
  1048.     _set_nodeValue = _set_data
  1049.     
  1050.     def __setattr__(self, name, value):
  1051.         if name == 'data' or name == 'nodeValue':
  1052.             self.__dict__['data'] = self.__dict__['nodeValue'] = value
  1053.         else:
  1054.             self.__dict__[name] = value
  1055.  
  1056.     
  1057.     def __repr__(self):
  1058.         data = self.data
  1059.         if len(data) > 10:
  1060.             dotdotdot = '...'
  1061.         else:
  1062.             dotdotdot = ''
  1063.         return '<DOM %s node "%s%s">' % (self.__class__.__name__, data[0:10], dotdotdot)
  1064.  
  1065.     
  1066.     def substringData(self, offset, count):
  1067.         if offset < 0:
  1068.             raise xml.dom.IndexSizeErr('offset cannot be negative')
  1069.         
  1070.         if offset >= len(self.data):
  1071.             raise xml.dom.IndexSizeErr('offset cannot be beyond end of data')
  1072.         
  1073.         if count < 0:
  1074.             raise xml.dom.IndexSizeErr('count cannot be negative')
  1075.         
  1076.         return self.data[offset:offset + count]
  1077.  
  1078.     
  1079.     def appendData(self, arg):
  1080.         self.data = self.data + arg
  1081.  
  1082.     
  1083.     def insertData(self, offset, arg):
  1084.         if offset < 0:
  1085.             raise xml.dom.IndexSizeErr('offset cannot be negative')
  1086.         
  1087.         if offset >= len(self.data):
  1088.             raise xml.dom.IndexSizeErr('offset cannot be beyond end of data')
  1089.         
  1090.         if arg:
  1091.             self.data = '%s%s%s' % (self.data[:offset], arg, self.data[offset:])
  1092.         
  1093.  
  1094.     
  1095.     def deleteData(self, offset, count):
  1096.         if offset < 0:
  1097.             raise xml.dom.IndexSizeErr('offset cannot be negative')
  1098.         
  1099.         if offset >= len(self.data):
  1100.             raise xml.dom.IndexSizeErr('offset cannot be beyond end of data')
  1101.         
  1102.         if count < 0:
  1103.             raise xml.dom.IndexSizeErr('count cannot be negative')
  1104.         
  1105.         if count:
  1106.             self.data = self.data[:offset] + self.data[offset + count:]
  1107.         
  1108.  
  1109.     
  1110.     def replaceData(self, offset, count, arg):
  1111.         if offset < 0:
  1112.             raise xml.dom.IndexSizeErr('offset cannot be negative')
  1113.         
  1114.         if offset >= len(self.data):
  1115.             raise xml.dom.IndexSizeErr('offset cannot be beyond end of data')
  1116.         
  1117.         if count < 0:
  1118.             raise xml.dom.IndexSizeErr('count cannot be negative')
  1119.         
  1120.         if count:
  1121.             self.data = '%s%s%s' % (self.data[:offset], arg, self.data[offset + count:])
  1122.         
  1123.  
  1124.  
  1125. defproperty(CharacterData, 'length', doc = 'Length of the string data.')
  1126.  
  1127. class Text(CharacterData):
  1128.     nodeType = Node.TEXT_NODE
  1129.     nodeName = '#text'
  1130.     attributes = None
  1131.     
  1132.     def splitText(self, offset):
  1133.         if offset < 0 or offset > len(self.data):
  1134.             raise xml.dom.IndexSizeErr('illegal offset value')
  1135.         
  1136.         newText = self.__class__()
  1137.         newText.data = self.data[offset:]
  1138.         newText.ownerDocument = self.ownerDocument
  1139.         next = self.nextSibling
  1140.         if self.parentNode and self in self.parentNode.childNodes:
  1141.             if next is None:
  1142.                 self.parentNode.appendChild(newText)
  1143.             else:
  1144.                 self.parentNode.insertBefore(newText, next)
  1145.         
  1146.         self.data = self.data[:offset]
  1147.         return newText
  1148.  
  1149.     
  1150.     def writexml(self, writer, indent = '', addindent = '', newl = ''):
  1151.         _write_data(writer, '%s%s%s' % (indent, self.data, newl))
  1152.  
  1153.     
  1154.     def _get_wholeText(self):
  1155.         L = [
  1156.             self.data]
  1157.         n = self.previousSibling
  1158.         while n is not None:
  1159.             if n.nodeType in (Node.TEXT_NODE, Node.CDATA_SECTION_NODE):
  1160.                 L.insert(0, n.data)
  1161.                 n = n.previousSibling
  1162.                 continue
  1163.             break
  1164.         n = self.nextSibling
  1165.         while n is not None:
  1166.             if n.nodeType in (Node.TEXT_NODE, Node.CDATA_SECTION_NODE):
  1167.                 L.append(n.data)
  1168.                 n = n.nextSibling
  1169.                 continue
  1170.             break
  1171.         return ''.join(L)
  1172.  
  1173.     
  1174.     def replaceWholeText(self, content):
  1175.         parent = self.parentNode
  1176.         n = self.previousSibling
  1177.         while n is not None:
  1178.             if n.nodeType in (Node.TEXT_NODE, Node.CDATA_SECTION_NODE):
  1179.                 next = n.previousSibling
  1180.                 parent.removeChild(n)
  1181.                 n = next
  1182.                 continue
  1183.             break
  1184.         n = self.nextSibling
  1185.         if not content:
  1186.             parent.removeChild(self)
  1187.         
  1188.         while n is not None:
  1189.             if n.nodeType in (Node.TEXT_NODE, Node.CDATA_SECTION_NODE):
  1190.                 next = n.nextSibling
  1191.                 parent.removeChild(n)
  1192.                 n = next
  1193.                 continue
  1194.             break
  1195.         if content:
  1196.             d = self.__dict__
  1197.             d['data'] = content
  1198.             d['nodeValue'] = content
  1199.             return self
  1200.         else:
  1201.             return None
  1202.  
  1203.     
  1204.     def _get_isWhitespaceInElementContent(self):
  1205.         if self.data.strip():
  1206.             return False
  1207.         
  1208.         elem = _get_containing_element(self)
  1209.         if elem is None:
  1210.             return False
  1211.         
  1212.         info = self.ownerDocument._get_elem_info(elem)
  1213.         if info is None:
  1214.             return False
  1215.         else:
  1216.             return info.isElementContent()
  1217.  
  1218.  
  1219. defproperty(Text, 'isWhitespaceInElementContent', doc = 'True iff this text node contains only whitespace and is in element content.')
  1220. defproperty(Text, 'wholeText', doc = 'The text of all logically-adjacent text nodes.')
  1221.  
  1222. def _get_containing_element(node):
  1223.     c = node.parentNode
  1224.     while c is not None:
  1225.         if c.nodeType == Node.ELEMENT_NODE:
  1226.             return c
  1227.         
  1228.         c = c.parentNode
  1229.  
  1230.  
  1231. def _get_containing_entref(node):
  1232.     c = node.parentNode
  1233.     while c is not None:
  1234.         if c.nodeType == Node.ENTITY_REFERENCE_NODE:
  1235.             return c
  1236.         
  1237.         c = c.parentNode
  1238.  
  1239.  
  1240. class Comment(Childless, CharacterData):
  1241.     nodeType = Node.COMMENT_NODE
  1242.     nodeName = '#comment'
  1243.     
  1244.     def __init__(self, data):
  1245.         self.data = self.nodeValue = data
  1246.  
  1247.     
  1248.     def writexml(self, writer, indent = '', addindent = '', newl = ''):
  1249.         writer.write('%s<!--%s-->%s' % (indent, self.data, newl))
  1250.  
  1251.  
  1252.  
  1253. class CDATASection(Text):
  1254.     nodeType = Node.CDATA_SECTION_NODE
  1255.     nodeName = '#cdata-section'
  1256.     
  1257.     def writexml(self, writer, indent = '', addindent = '', newl = ''):
  1258.         if self.data.find(']]>') >= 0:
  1259.             raise ValueError("']]>' not allowed in a CDATA section")
  1260.         
  1261.         writer.write('<![CDATA[%s]]>' % self.data)
  1262.  
  1263.  
  1264.  
  1265. class ReadOnlySequentialNamedNodeMap(object):
  1266.     __slots__ = ('_seq',)
  1267.     
  1268.     def __init__(self, seq = ()):
  1269.         self._seq = seq
  1270.  
  1271.     
  1272.     def __len__(self):
  1273.         return len(self._seq)
  1274.  
  1275.     
  1276.     def _get_length(self):
  1277.         return len(self._seq)
  1278.  
  1279.     
  1280.     def getNamedItem(self, name):
  1281.         for n in self._seq:
  1282.             if n.nodeName == name:
  1283.                 return n
  1284.                 continue
  1285.         
  1286.  
  1287.     
  1288.     def getNamedItemNS(self, namespaceURI, localName):
  1289.         for n in self._seq:
  1290.             if n.namespaceURI == namespaceURI and n.localName == localName:
  1291.                 return n
  1292.                 continue
  1293.         
  1294.  
  1295.     
  1296.     def __getitem__(self, name_or_tuple):
  1297.         if isinstance(name_or_tuple, tuple):
  1298.             node = self.getNamedItemNS(*name_or_tuple)
  1299.         else:
  1300.             node = self.getNamedItem(name_or_tuple)
  1301.         if node is None:
  1302.             raise KeyError, name_or_tuple
  1303.         
  1304.         return node
  1305.  
  1306.     
  1307.     def item(self, index):
  1308.         if index < 0:
  1309.             return None
  1310.         
  1311.         
  1312.         try:
  1313.             return self._seq[index]
  1314.         except IndexError:
  1315.             return None
  1316.  
  1317.  
  1318.     
  1319.     def removeNamedItem(self, name):
  1320.         raise xml.dom.NoModificationAllowedErr('NamedNodeMap instance is read-only')
  1321.  
  1322.     
  1323.     def removeNamedItemNS(self, namespaceURI, localName):
  1324.         raise xml.dom.NoModificationAllowedErr('NamedNodeMap instance is read-only')
  1325.  
  1326.     
  1327.     def setNamedItem(self, node):
  1328.         raise xml.dom.NoModificationAllowedErr('NamedNodeMap instance is read-only')
  1329.  
  1330.     
  1331.     def setNamedItemNS(self, node):
  1332.         raise xml.dom.NoModificationAllowedErr('NamedNodeMap instance is read-only')
  1333.  
  1334.     
  1335.     def __getstate__(self):
  1336.         return [
  1337.             self._seq]
  1338.  
  1339.     
  1340.     def __setstate__(self, state):
  1341.         self._seq = state[0]
  1342.  
  1343.  
  1344. defproperty(ReadOnlySequentialNamedNodeMap, 'length', doc = 'Number of entries in the NamedNodeMap.')
  1345.  
  1346. class Identified:
  1347.     '''Mix-in class that supports the publicId and systemId attributes.'''
  1348.     
  1349.     def _identified_mixin_init(self, publicId, systemId):
  1350.         self.publicId = publicId
  1351.         self.systemId = systemId
  1352.  
  1353.     
  1354.     def _get_publicId(self):
  1355.         return self.publicId
  1356.  
  1357.     
  1358.     def _get_systemId(self):
  1359.         return self.systemId
  1360.  
  1361.  
  1362.  
  1363. class DocumentType(Identified, Childless, Node):
  1364.     nodeType = Node.DOCUMENT_TYPE_NODE
  1365.     nodeValue = None
  1366.     name = None
  1367.     publicId = None
  1368.     systemId = None
  1369.     internalSubset = None
  1370.     
  1371.     def __init__(self, qualifiedName):
  1372.         self.entities = ReadOnlySequentialNamedNodeMap()
  1373.         self.notations = ReadOnlySequentialNamedNodeMap()
  1374.         if qualifiedName:
  1375.             (prefix, localname) = _nssplit(qualifiedName)
  1376.             self.name = localname
  1377.         
  1378.         self.nodeName = self.name
  1379.  
  1380.     
  1381.     def _get_internalSubset(self):
  1382.         return self.internalSubset
  1383.  
  1384.     
  1385.     def cloneNode(self, deep):
  1386.         if self.ownerDocument is None:
  1387.             clone = DocumentType(None)
  1388.             clone.name = self.name
  1389.             clone.nodeName = self.name
  1390.             operation = xml.dom.UserDataHandler.NODE_CLONED
  1391.             if deep:
  1392.                 clone.entities._seq = []
  1393.                 clone.notations._seq = []
  1394.                 for n in self.notations._seq:
  1395.                     notation = Notation(n.nodeName, n.publicId, n.systemId)
  1396.                     clone.notations._seq.append(notation)
  1397.                     n._call_user_data_handler(operation, n, notation)
  1398.                 
  1399.                 for e in self.entities._seq:
  1400.                     entity = Entity(e.nodeName, e.publicId, e.systemId, e.notationName)
  1401.                     entity.actualEncoding = e.actualEncoding
  1402.                     entity.encoding = e.encoding
  1403.                     entity.version = e.version
  1404.                     clone.entities._seq.append(entity)
  1405.                     e._call_user_data_handler(operation, n, entity)
  1406.                 
  1407.             
  1408.             self._call_user_data_handler(operation, self, clone)
  1409.             return clone
  1410.         else:
  1411.             return None
  1412.  
  1413.     
  1414.     def writexml(self, writer, indent = '', addindent = '', newl = ''):
  1415.         writer.write('<!DOCTYPE ')
  1416.         writer.write(self.name)
  1417.         if self.publicId:
  1418.             writer.write("%s  PUBLIC '%s'%s  '%s'" % (newl, self.publicId, newl, self.systemId))
  1419.         elif self.systemId:
  1420.             writer.write("%s  SYSTEM '%s'" % (newl, self.systemId))
  1421.         
  1422.         if self.internalSubset is not None:
  1423.             writer.write(' [')
  1424.             writer.write(self.internalSubset)
  1425.             writer.write(']')
  1426.         
  1427.         writer.write('>' + newl)
  1428.  
  1429.  
  1430.  
  1431. class Entity(Identified, Node):
  1432.     attributes = None
  1433.     nodeType = Node.ENTITY_NODE
  1434.     nodeValue = None
  1435.     actualEncoding = None
  1436.     encoding = None
  1437.     version = None
  1438.     
  1439.     def __init__(self, name, publicId, systemId, notation):
  1440.         self.nodeName = name
  1441.         self.notationName = notation
  1442.         self.childNodes = NodeList()
  1443.         self._identified_mixin_init(publicId, systemId)
  1444.  
  1445.     
  1446.     def _get_actualEncoding(self):
  1447.         return self.actualEncoding
  1448.  
  1449.     
  1450.     def _get_encoding(self):
  1451.         return self.encoding
  1452.  
  1453.     
  1454.     def _get_version(self):
  1455.         return self.version
  1456.  
  1457.     
  1458.     def appendChild(self, newChild):
  1459.         raise xml.dom.HierarchyRequestErr('cannot append children to an entity node')
  1460.  
  1461.     
  1462.     def insertBefore(self, newChild, refChild):
  1463.         raise xml.dom.HierarchyRequestErr('cannot insert children below an entity node')
  1464.  
  1465.     
  1466.     def removeChild(self, oldChild):
  1467.         raise xml.dom.HierarchyRequestErr('cannot remove children from an entity node')
  1468.  
  1469.     
  1470.     def replaceChild(self, newChild, oldChild):
  1471.         raise xml.dom.HierarchyRequestErr('cannot replace children of an entity node')
  1472.  
  1473.  
  1474.  
  1475. class Notation(Identified, Childless, Node):
  1476.     nodeType = Node.NOTATION_NODE
  1477.     nodeValue = None
  1478.     
  1479.     def __init__(self, name, publicId, systemId):
  1480.         self.nodeName = name
  1481.         self._identified_mixin_init(publicId, systemId)
  1482.  
  1483.  
  1484.  
  1485. class DOMImplementation(DOMImplementationLS):
  1486.     _features = [
  1487.         ('core', '1.0'),
  1488.         ('core', '2.0'),
  1489.         ('core', '3.0'),
  1490.         ('core', None),
  1491.         ('xml', '1.0'),
  1492.         ('xml', '2.0'),
  1493.         ('xml', '3.0'),
  1494.         ('xml', None),
  1495.         ('ls-load', '3.0'),
  1496.         ('ls-load', None)]
  1497.     
  1498.     def hasFeature(self, feature, version):
  1499.         if version == '':
  1500.             version = None
  1501.         
  1502.         return (feature.lower(), version) in self._features
  1503.  
  1504.     
  1505.     def createDocument(self, namespaceURI, qualifiedName, doctype):
  1506.         if doctype and doctype.parentNode is not None:
  1507.             raise xml.dom.WrongDocumentErr('doctype object owned by another DOM tree')
  1508.         
  1509.         doc = self._create_document()
  1510.         if namespaceURI is None and qualifiedName is None:
  1511.             pass
  1512.         add_root_element = not (doctype is None)
  1513.         if not qualifiedName and add_root_element:
  1514.             raise xml.dom.InvalidCharacterErr('Element with no name')
  1515.         
  1516.         if add_root_element:
  1517.             (prefix, localname) = _nssplit(qualifiedName)
  1518.             if prefix == 'xml' and namespaceURI != 'http://www.w3.org/XML/1998/namespace':
  1519.                 raise xml.dom.NamespaceErr("illegal use of 'xml' prefix")
  1520.             
  1521.             if prefix and not namespaceURI:
  1522.                 raise xml.dom.NamespaceErr('illegal use of prefix without namespaces')
  1523.             
  1524.             element = doc.createElementNS(namespaceURI, qualifiedName)
  1525.             if doctype:
  1526.                 doc.appendChild(doctype)
  1527.             
  1528.             doc.appendChild(element)
  1529.         
  1530.         if doctype:
  1531.             doctype.parentNode = doctype.ownerDocument = doc
  1532.         
  1533.         doc.doctype = doctype
  1534.         doc.implementation = self
  1535.         return doc
  1536.  
  1537.     
  1538.     def createDocumentType(self, qualifiedName, publicId, systemId):
  1539.         doctype = DocumentType(qualifiedName)
  1540.         doctype.publicId = publicId
  1541.         doctype.systemId = systemId
  1542.         return doctype
  1543.  
  1544.     
  1545.     def getInterface(self, feature):
  1546.         if self.hasFeature(feature, None):
  1547.             return self
  1548.         else:
  1549.             return None
  1550.  
  1551.     
  1552.     def _create_document(self):
  1553.         return Document()
  1554.  
  1555.  
  1556.  
  1557. class ElementInfo(object):
  1558.     '''Object that represents content-model information for an element.
  1559.  
  1560.     This implementation is not expected to be used in practice; DOM
  1561.     builders should provide implementations which do the right thing
  1562.     using information available to it.
  1563.  
  1564.     '''
  1565.     __slots__ = ('tagName',)
  1566.     
  1567.     def __init__(self, name):
  1568.         self.tagName = name
  1569.  
  1570.     
  1571.     def getAttributeType(self, aname):
  1572.         return _no_type
  1573.  
  1574.     
  1575.     def getAttributeTypeNS(self, namespaceURI, localName):
  1576.         return _no_type
  1577.  
  1578.     
  1579.     def isElementContent(self):
  1580.         return False
  1581.  
  1582.     
  1583.     def isEmpty(self):
  1584.         '''Returns true iff this element is declared to have an EMPTY
  1585.         content model.'''
  1586.         return False
  1587.  
  1588.     
  1589.     def isId(self, aname):
  1590.         '''Returns true iff the named attribte is a DTD-style ID.'''
  1591.         return False
  1592.  
  1593.     
  1594.     def isIdNS(self, namespaceURI, localName):
  1595.         '''Returns true iff the identified attribute is a DTD-style ID.'''
  1596.         return False
  1597.  
  1598.     
  1599.     def __getstate__(self):
  1600.         return self.tagName
  1601.  
  1602.     
  1603.     def __setstate__(self, state):
  1604.         self.tagName = state
  1605.  
  1606.  
  1607.  
  1608. def _clear_id_cache(node):
  1609.     if node.nodeType == Node.DOCUMENT_NODE:
  1610.         node._id_cache.clear()
  1611.         node._id_search_stack = None
  1612.     elif _in_document(node):
  1613.         node.ownerDocument._id_cache.clear()
  1614.         node.ownerDocument._id_search_stack = None
  1615.     
  1616.  
  1617.  
  1618. class Document(Node, DocumentLS):
  1619.     _child_node_types = (Node.ELEMENT_NODE, Node.PROCESSING_INSTRUCTION_NODE, Node.COMMENT_NODE, Node.DOCUMENT_TYPE_NODE)
  1620.     nodeType = Node.DOCUMENT_NODE
  1621.     nodeName = '#document'
  1622.     nodeValue = None
  1623.     attributes = None
  1624.     doctype = None
  1625.     parentNode = None
  1626.     previousSibling = nextSibling = None
  1627.     implementation = DOMImplementation()
  1628.     actualEncoding = None
  1629.     encoding = None
  1630.     standalone = None
  1631.     version = None
  1632.     strictErrorChecking = False
  1633.     errorHandler = None
  1634.     documentURI = None
  1635.     _magic_id_count = 0
  1636.     
  1637.     def __init__(self):
  1638.         self.childNodes = NodeList()
  1639.         self._elem_info = { }
  1640.         self._id_cache = { }
  1641.         self._id_search_stack = None
  1642.  
  1643.     
  1644.     def _get_elem_info(self, element):
  1645.         if element.namespaceURI:
  1646.             key = (element.namespaceURI, element.localName)
  1647.         else:
  1648.             key = element.tagName
  1649.         return self._elem_info.get(key)
  1650.  
  1651.     
  1652.     def _get_actualEncoding(self):
  1653.         return self.actualEncoding
  1654.  
  1655.     
  1656.     def _get_doctype(self):
  1657.         return self.doctype
  1658.  
  1659.     
  1660.     def _get_documentURI(self):
  1661.         return self.documentURI
  1662.  
  1663.     
  1664.     def _get_encoding(self):
  1665.         return self.encoding
  1666.  
  1667.     
  1668.     def _get_errorHandler(self):
  1669.         return self.errorHandler
  1670.  
  1671.     
  1672.     def _get_standalone(self):
  1673.         return self.standalone
  1674.  
  1675.     
  1676.     def _get_strictErrorChecking(self):
  1677.         return self.strictErrorChecking
  1678.  
  1679.     
  1680.     def _get_version(self):
  1681.         return self.version
  1682.  
  1683.     
  1684.     def appendChild(self, node):
  1685.         if node.nodeType not in self._child_node_types:
  1686.             raise xml.dom.HierarchyRequestErr('%s cannot be child of %s' % (repr(node), repr(self)))
  1687.         
  1688.         if node.parentNode is not None:
  1689.             node.parentNode.removeChild(node)
  1690.         
  1691.         if node.nodeType == Node.ELEMENT_NODE and self._get_documentElement():
  1692.             raise xml.dom.HierarchyRequestErr('two document elements disallowed')
  1693.         
  1694.         return Node.appendChild(self, node)
  1695.  
  1696.     
  1697.     def removeChild(self, oldChild):
  1698.         
  1699.         try:
  1700.             self.childNodes.remove(oldChild)
  1701.         except ValueError:
  1702.             raise xml.dom.NotFoundErr()
  1703.  
  1704.         oldChild.nextSibling = None
  1705.         oldChild.previousSibling = None
  1706.         oldChild.parentNode = None
  1707.         if self.documentElement is oldChild:
  1708.             self.documentElement = None
  1709.         
  1710.         return oldChild
  1711.  
  1712.     
  1713.     def _get_documentElement(self):
  1714.         for node in self.childNodes:
  1715.             if node.nodeType == Node.ELEMENT_NODE:
  1716.                 return node
  1717.                 continue
  1718.         
  1719.  
  1720.     
  1721.     def unlink(self):
  1722.         if self.doctype is not None:
  1723.             self.doctype.unlink()
  1724.             self.doctype = None
  1725.         
  1726.         Node.unlink(self)
  1727.  
  1728.     
  1729.     def cloneNode(self, deep):
  1730.         if not deep:
  1731.             return None
  1732.         
  1733.         clone = self.implementation.createDocument(None, None, None)
  1734.         clone.encoding = self.encoding
  1735.         clone.standalone = self.standalone
  1736.         clone.version = self.version
  1737.         for n in self.childNodes:
  1738.             childclone = _clone_node(n, deep, clone)
  1739.             if not childclone.ownerDocument.isSameNode(clone):
  1740.                 raise AssertionError
  1741.             clone.childNodes.append(childclone)
  1742.             if childclone.nodeType == Node.DOCUMENT_NODE:
  1743.                 if not clone.documentElement is None:
  1744.                     raise AssertionError
  1745.             elif childclone.nodeType == Node.DOCUMENT_TYPE_NODE:
  1746.                 if not clone.doctype is None:
  1747.                     raise AssertionError
  1748.                 clone.doctype = childclone
  1749.             
  1750.             childclone.parentNode = clone
  1751.         
  1752.         self._call_user_data_handler(xml.dom.UserDataHandler.NODE_CLONED, self, clone)
  1753.         return clone
  1754.  
  1755.     
  1756.     def createDocumentFragment(self):
  1757.         d = DocumentFragment()
  1758.         d.ownerDocument = self
  1759.         return d
  1760.  
  1761.     
  1762.     def createElement(self, tagName):
  1763.         e = Element(tagName)
  1764.         e.ownerDocument = self
  1765.         return e
  1766.  
  1767.     
  1768.     def createTextNode(self, data):
  1769.         if not isinstance(data, StringTypes):
  1770.             raise TypeError, 'node contents must be a string'
  1771.         
  1772.         t = Text()
  1773.         t.data = data
  1774.         t.ownerDocument = self
  1775.         return t
  1776.  
  1777.     
  1778.     def createCDATASection(self, data):
  1779.         if not isinstance(data, StringTypes):
  1780.             raise TypeError, 'node contents must be a string'
  1781.         
  1782.         c = CDATASection()
  1783.         c.data = data
  1784.         c.ownerDocument = self
  1785.         return c
  1786.  
  1787.     
  1788.     def createComment(self, data):
  1789.         c = Comment(data)
  1790.         c.ownerDocument = self
  1791.         return c
  1792.  
  1793.     
  1794.     def createProcessingInstruction(self, target, data):
  1795.         p = ProcessingInstruction(target, data)
  1796.         p.ownerDocument = self
  1797.         return p
  1798.  
  1799.     
  1800.     def createAttribute(self, qName):
  1801.         a = Attr(qName)
  1802.         a.ownerDocument = self
  1803.         a.value = ''
  1804.         return a
  1805.  
  1806.     
  1807.     def createElementNS(self, namespaceURI, qualifiedName):
  1808.         (prefix, localName) = _nssplit(qualifiedName)
  1809.         e = Element(qualifiedName, namespaceURI, prefix)
  1810.         e.ownerDocument = self
  1811.         return e
  1812.  
  1813.     
  1814.     def createAttributeNS(self, namespaceURI, qualifiedName):
  1815.         (prefix, localName) = _nssplit(qualifiedName)
  1816.         a = Attr(qualifiedName, namespaceURI, localName, prefix)
  1817.         a.ownerDocument = self
  1818.         a.value = ''
  1819.         return a
  1820.  
  1821.     
  1822.     def _create_entity(self, name, publicId, systemId, notationName):
  1823.         e = Entity(name, publicId, systemId, notationName)
  1824.         e.ownerDocument = self
  1825.         return e
  1826.  
  1827.     
  1828.     def _create_notation(self, name, publicId, systemId):
  1829.         n = Notation(name, publicId, systemId)
  1830.         n.ownerDocument = self
  1831.         return n
  1832.  
  1833.     
  1834.     def getElementById(self, id):
  1835.         if self._id_cache.has_key(id):
  1836.             return self._id_cache[id]
  1837.         
  1838.         if not self._elem_info or self._magic_id_count:
  1839.             return None
  1840.         
  1841.         stack = self._id_search_stack
  1842.         if stack is None:
  1843.             stack = [
  1844.                 self.documentElement]
  1845.             self._id_search_stack = stack
  1846.         elif not stack:
  1847.             return None
  1848.         
  1849.         result = None
  1850.         for child in node.childNodes:
  1851.             if child.nodeType in _nodeTypes_with_children:
  1852.                 continue
  1853.             _[1][child]
  1854.             [](_[1])
  1855.             info = self._get_elem_info(node)
  1856.             if info:
  1857.                 for attr in node.attributes.values():
  1858.                     if attr.namespaceURI:
  1859.                         if info.isIdNS(attr.namespaceURI, attr.localName):
  1860.                             self._id_cache[attr.value] = node
  1861.                             if attr.value == id:
  1862.                                 result = node
  1863.                             elif not node._magic_id_nodes:
  1864.                                 break
  1865.                             
  1866.                         
  1867.                     info.isIdNS(attr.namespaceURI, attr.localName)
  1868.                     if info.isId(attr.name):
  1869.                         self._id_cache[attr.value] = node
  1870.                         if attr.value == id:
  1871.                             result = node
  1872.                         elif not node._magic_id_nodes:
  1873.                             break
  1874.                         
  1875.                     attr.value == id
  1876.                     if attr._is_id:
  1877.                         self._id_cache[attr.value] = node
  1878.                         if attr.value == id:
  1879.                             result = node
  1880.                         elif node._magic_id_nodes == 1:
  1881.                             break
  1882.                         
  1883.                     attr.value == id
  1884.                 
  1885.             elif node._magic_id_nodes:
  1886.                 for attr in node.attributes.values():
  1887.                     if attr._is_id:
  1888.                         self._id_cache[attr.value] = node
  1889.                         if attr.value == id:
  1890.                             result = node
  1891.                         
  1892.                     attr.value == id
  1893.                 
  1894.             
  1895.             if result is not None:
  1896.                 break
  1897.                 continue
  1898.         return result
  1899.  
  1900.     
  1901.     def getElementsByTagName(self, name):
  1902.         return _get_elements_by_tagName_helper(self, name, NodeList())
  1903.  
  1904.     
  1905.     def getElementsByTagNameNS(self, namespaceURI, localName):
  1906.         return _get_elements_by_tagName_ns_helper(self, namespaceURI, localName, NodeList())
  1907.  
  1908.     
  1909.     def isSupported(self, feature, version):
  1910.         return self.implementation.hasFeature(feature, version)
  1911.  
  1912.     
  1913.     def importNode(self, node, deep):
  1914.         if node.nodeType == Node.DOCUMENT_NODE:
  1915.             raise xml.dom.NotSupportedErr('cannot import document nodes')
  1916.         elif node.nodeType == Node.DOCUMENT_TYPE_NODE:
  1917.             raise xml.dom.NotSupportedErr('cannot import document type nodes')
  1918.         
  1919.         return _clone_node(node, deep, self)
  1920.  
  1921.     
  1922.     def writexml(self, writer, indent = '', addindent = '', newl = '', encoding = None):
  1923.         if encoding is None:
  1924.             writer.write('<?xml version="1.0" ?>' + newl)
  1925.         else:
  1926.             writer.write('<?xml version="1.0" encoding="%s"?>%s' % (encoding, newl))
  1927.         for node in self.childNodes:
  1928.             node.writexml(writer, indent, addindent, newl)
  1929.         
  1930.  
  1931.     
  1932.     def renameNode(self, n, namespaceURI, name):
  1933.         if n.ownerDocument is not self:
  1934.             raise xml.dom.WrongDocumentErr('cannot rename nodes from other documents;\nexpected %s,\nfound %s' % (self, n.ownerDocument))
  1935.         
  1936.         if n.nodeType not in (Node.ELEMENT_NODE, Node.ATTRIBUTE_NODE):
  1937.             raise xml.dom.NotSupportedErr('renameNode() only applies to element and attribute nodes')
  1938.         
  1939.         if namespaceURI != EMPTY_NAMESPACE:
  1940.             if ':' in name:
  1941.                 (prefix, localName) = name.split(':', 1)
  1942.                 if prefix == 'xmlns' and namespaceURI != xml.dom.XMLNS_NAMESPACE:
  1943.                     raise xml.dom.NamespaceErr("illegal use of 'xmlns' prefix")
  1944.                 
  1945.             elif name == 'xmlns' and namespaceURI != xml.dom.XMLNS_NAMESPACE and n.nodeType == Node.ATTRIBUTE_NODE:
  1946.                 raise xml.dom.NamespaceErr("illegal use of the 'xmlns' attribute")
  1947.             
  1948.             prefix = None
  1949.             localName = name
  1950.         else:
  1951.             prefix = None
  1952.             localName = None
  1953.         if n.nodeType == Node.ATTRIBUTE_NODE:
  1954.             element = n.ownerElement
  1955.             if element is not None:
  1956.                 is_id = n._is_id
  1957.                 element.removeAttributeNode(n)
  1958.             
  1959.         else:
  1960.             element = None
  1961.         d = n.__dict__
  1962.         d['prefix'] = prefix
  1963.         d['localName'] = localName
  1964.         d['namespaceURI'] = namespaceURI
  1965.         d['nodeName'] = name
  1966.         if n.nodeType == Node.ELEMENT_NODE:
  1967.             d['tagName'] = name
  1968.         else:
  1969.             d['name'] = name
  1970.             if element is not None:
  1971.                 element.setAttributeNode(n)
  1972.                 if is_id:
  1973.                     element.setIdAttributeNode(n)
  1974.                 
  1975.             
  1976.         return n
  1977.  
  1978.  
  1979. defproperty(Document, 'documentElement', doc = 'Top-level element of this document.')
  1980.  
  1981. def _clone_node(node, deep, newOwnerDocument):
  1982.     '''
  1983.     Clone a node and give it the new owner document.
  1984.     Called by Node.cloneNode and Document.importNode
  1985.     '''
  1986.     if node.ownerDocument.isSameNode(newOwnerDocument):
  1987.         operation = xml.dom.UserDataHandler.NODE_CLONED
  1988.     else:
  1989.         operation = xml.dom.UserDataHandler.NODE_IMPORTED
  1990.     if node.nodeType == Node.ELEMENT_NODE:
  1991.         clone = newOwnerDocument.createElementNS(node.namespaceURI, node.nodeName)
  1992.         for attr in node.attributes.values():
  1993.             clone.setAttributeNS(attr.namespaceURI, attr.nodeName, attr.value)
  1994.             a = clone.getAttributeNodeNS(attr.namespaceURI, attr.localName)
  1995.             a.specified = attr.specified
  1996.         
  1997.         if deep:
  1998.             for child in node.childNodes:
  1999.                 c = _clone_node(child, deep, newOwnerDocument)
  2000.                 clone.appendChild(c)
  2001.             
  2002.         
  2003.     elif node.nodeType == Node.DOCUMENT_FRAGMENT_NODE:
  2004.         clone = newOwnerDocument.createDocumentFragment()
  2005.         if deep:
  2006.             for child in node.childNodes:
  2007.                 c = _clone_node(child, deep, newOwnerDocument)
  2008.                 clone.appendChild(c)
  2009.             
  2010.         
  2011.     elif node.nodeType == Node.TEXT_NODE:
  2012.         clone = newOwnerDocument.createTextNode(node.data)
  2013.     elif node.nodeType == Node.CDATA_SECTION_NODE:
  2014.         clone = newOwnerDocument.createCDATASection(node.data)
  2015.     elif node.nodeType == Node.PROCESSING_INSTRUCTION_NODE:
  2016.         clone = newOwnerDocument.createProcessingInstruction(node.target, node.data)
  2017.     elif node.nodeType == Node.COMMENT_NODE:
  2018.         clone = newOwnerDocument.createComment(node.data)
  2019.     elif node.nodeType == Node.ATTRIBUTE_NODE:
  2020.         clone = newOwnerDocument.createAttributeNS(node.namespaceURI, node.nodeName)
  2021.         clone.specified = True
  2022.         clone.value = node.value
  2023.     elif node.nodeType == Node.DOCUMENT_TYPE_NODE:
  2024.         if not node.ownerDocument is not newOwnerDocument:
  2025.             raise AssertionError
  2026.         operation = xml.dom.UserDataHandler.NODE_IMPORTED
  2027.         clone = newOwnerDocument.implementation.createDocumentType(node.name, node.publicId, node.systemId)
  2028.         clone.ownerDocument = newOwnerDocument
  2029.         if deep:
  2030.             clone.entities._seq = []
  2031.             clone.notations._seq = []
  2032.             for n in node.notations._seq:
  2033.                 notation = Notation(n.nodeName, n.publicId, n.systemId)
  2034.                 notation.ownerDocument = newOwnerDocument
  2035.                 clone.notations._seq.append(notation)
  2036.                 if hasattr(n, '_call_user_data_handler'):
  2037.                     n._call_user_data_handler(operation, n, notation)
  2038.                     continue
  2039.             
  2040.             for e in node.entities._seq:
  2041.                 entity = Entity(e.nodeName, e.publicId, e.systemId, e.notationName)
  2042.                 entity.actualEncoding = e.actualEncoding
  2043.                 entity.encoding = e.encoding
  2044.                 entity.version = e.version
  2045.                 entity.ownerDocument = newOwnerDocument
  2046.                 clone.entities._seq.append(entity)
  2047.                 if hasattr(e, '_call_user_data_handler'):
  2048.                     e._call_user_data_handler(operation, n, entity)
  2049.                     continue
  2050.             
  2051.         
  2052.     else:
  2053.         raise xml.dom.NotSupportedErr('Cannot clone node %s' % repr(node))
  2054.     if hasattr(node, '_call_user_data_handler'):
  2055.         node._call_user_data_handler(operation, node, clone)
  2056.     
  2057.     return clone
  2058.  
  2059.  
  2060. def _nssplit(qualifiedName):
  2061.     fields = qualifiedName.split(':', 1)
  2062.     if len(fields) == 2:
  2063.         return fields
  2064.     else:
  2065.         return (None, fields[0])
  2066.  
  2067.  
  2068. def _get_StringIO():
  2069.     StringIO = StringIO
  2070.     import StringIO
  2071.     return StringIO()
  2072.  
  2073.  
  2074. def _do_pulldom_parse(func, args, kwargs):
  2075.     events = func(*args, **kwargs)
  2076.     (toktype, rootNode) = events.getEvent()
  2077.     events.expandNode(rootNode)
  2078.     events.clear()
  2079.     return rootNode
  2080.  
  2081.  
  2082. def parse(file, parser = None, bufsize = None):
  2083.     '''Parse a file into a DOM by filename or file object.'''
  2084.     if parser is None and not bufsize:
  2085.         expatbuilder = expatbuilder
  2086.         import xml.dom
  2087.         return expatbuilder.parse(file)
  2088.     else:
  2089.         pulldom = pulldom
  2090.         import xml.dom
  2091.         return _do_pulldom_parse(pulldom.parse, (file,), {
  2092.             'parser': parser,
  2093.             'bufsize': bufsize })
  2094.  
  2095.  
  2096. def parseString(string, parser = None):
  2097.     '''Parse a file into a DOM from a string.'''
  2098.     if parser is None:
  2099.         expatbuilder = expatbuilder
  2100.         import xml.dom
  2101.         return expatbuilder.parseString(string)
  2102.     else:
  2103.         pulldom = pulldom
  2104.         import xml.dom
  2105.         return _do_pulldom_parse(pulldom.parseString, (string,), {
  2106.             'parser': parser })
  2107.  
  2108.  
  2109. def getDOMImplementation(features = None):
  2110.     if features:
  2111.         if isinstance(features, StringTypes):
  2112.             features = domreg._parse_feature_string(features)
  2113.         
  2114.         for f, v in features:
  2115.             if not Document.implementation.hasFeature(f, v):
  2116.                 return None
  2117.                 continue
  2118.         
  2119.     
  2120.     return Document.implementation
  2121.  
  2122.